返回博客列表

Python 新工具 uv 详解与 externally-managed-environment 错误解决

介绍Python新一代包管理工具uv的使用,以及如何解决externally-managed-environment相关错误。

2024-01-195 分钟阅读Yaron
#Python#包管理#开发工具#Python3.11+

摘要

Python 3.11 引入的 externally-managed-environment 错误旨在保护系统 Python 环境,但有时会给开发者带来困扰。本文将介绍新兴的 Python 包管理工具 uv,解释其如何通过内置的虚拟环境管理功能,优雅地解决这一错误,并提升依赖管理的效率。

1. 什么是 uv?

uv 是一个由 Rye 项目开发、用 Rust 语言 编写的 Python 包安装程序和解析器。它旨在成为传统 pip 和 pip-tools 的极速替代品,提供更快的依赖管理体验。

uv 的核心功能包括:

  • 极速的包安装器: 旨在比 pip 快 10-100 倍,通过并行化下载和编译、更智能的依赖解析算法来加速安装过程。
  • 依赖解析器: 能够解析 requirements.in 等文件,并生成确定性的 requirements.txt 文件,确保依赖的可复现性。
  • 虚拟环境管理器: 内置了创建和管理虚拟环境的功能,可以替代 python -m venv 或 virtualenv。
  • 跨平台: 由于用 Rust 编写,uv 在不同操作系统上提供一致的高性能。

简而言之,uv 是一个将 Python 依赖管理和虚拟环境操作的多个工具整合到一个单一、高效的解决方案。

2. uv 与虚拟环境的关系

uv 与虚拟环境的关系非常紧密,因为它内置了虚拟环境管理功能,并且通常推荐在虚拟环境中使用 uv

  • 创建虚拟环境: 你可以使用 uv venv 命令快速创建新的虚拟环境,例如:

    uv venv .venv
    

    这会在当前目录下创建一个名为 .venv 的虚拟环境。

  • 在虚拟环境中安装包: 创建并激活虚拟环境后,你可以通过 uv pip install package 或 uv pip sync (同步 requirements.txt) 等命令在其中安装和管理依赖。例如:

    source .venv/bin/activate # 激活虚拟环境
    uv pip install requests   # 在激活的虚拟环境中安装 requests
    

    uv 旨在让虚拟环境的创建和包的安装变得更快、更可靠。

3. 理解 externally-managed-environment 错误

你之前在 PyCharm 中安装 Python 包时遇到了 ERROR: externally-managed-environment 错误。这个错误是 Python 3.11 及更高版本引入的 PEP 668 规范导致的,其核心目的是:

  • 保护系统或外部管理的 Python 环境: 防止用户直接使用 pip 修改由操作系统(如通过 apt、yum 安装的 Python)或第三方工具(如 uv、conda)管理的 Python 环境。
  • 避免破坏环境: 直接修改这些环境可能导致系统工具或依赖这些环境的其他应用程序出现问题。

当你看到类似 This Python installation is managed by uv and should not be modified. 的提示时,就说明你正在尝试修改一个受保护的 Python 环境。

4. uv 如何解决 externally-managed-environment 错误

uv 本身就是为了解决这类问题而设计的,它通过推广和优化虚拟环境的使用来规避这个错误:

  1. 虚拟环境是隔离的: 当你使用 uv(或 python -m venv)创建一个虚拟环境时,这个环境是独立于系统或外部管理的主 Python 环境的。它有自己独立的 site-packages 目录,所有的包都安装在这个隔离的目录中。
  2. 不再受保护: 一旦你激活并进入了这个虚拟环境,你在其中进行的任何 pip install 或 uv pip install 操作,都只会影响这个虚拟环境,而不会触及到受 externally-managed-environment 保护的外部环境。
  3. 绕过限制: 因此,通过在虚拟环境中使用 uv pip install(或传统的 pip install),你就可以自由地安装和管理项目依赖,而不会触发 externally-managed-environment 错误。

总结: uv 不仅是一个高性能的 Python 包管理工具,它还通过其内置的虚拟环境管理功能,提供了一种优雅且符合最佳实践的方式来解决 externally-managed-environment 错误,确保你的项目依赖管理既高效又安全。